热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

票据|都会_微信开发小结——积累与沉淀

篇首语:本文由编程笔记#小编为大家整理,主要介绍了微信开发小结——积累与沉淀相关的知识,希望对你有一定的参考价值。前言微

篇首语:本文由编程笔记#小编为大家整理,主要介绍了微信开发小结——积累与沉淀相关的知识,希望对你有一定的参考价值。


前言

微信开发是个人、企业或组织在拥有超大用户群体的微信应用上,利用微信公众平台,开发类似插件或服务的轻应用。微信公众平台分为三种:订阅号:主要面向媒体和个人,旨在为用户提供信息资讯,每天能够群发1条消息,通过微信认证,可获得菜单、获得用户信息等接口权限;服务号:主要面向企业、政府和组织,旨在为用户提供服务,每月能够群发4条消息,通过微信认证,可获得高级接口权限;企业号:主要面向企业,旨在为企业用户提供移动端办公,只有企业通讯录中的用户才能关注使用,可以自由推送消息,不受限制,保密消息,防转发。期间我负责开发了基于服务号的微信投票和基于企业号的微信ERP,以下我主要从开发的角度介绍期间遇到的问题和心得体会。

前提准备

1、微信公众号申请,并通过微信认证。

2、准备一个二级以上域名,域名必须要备案。

3、对于需要自定义开发,需要提供可以部署程序的公网服务器。

对于2、3点,可以由开发公司提供,只需提供客户方一个管理后台地址和管理员账号密码,由客户方管理人员进行维护。

开发者认证获取票据

无论何种公众平台,开发者第一步工作是,获取AccessToken票据,因为绝大部分调用接口时都需携带AccessToken票据。AccessToken需要用申请的公众平台提供的CorpID和Secret(服务号则用AppID和Secret)来换取,不同的Secret会返回不同的AccessToken,换取的过程就是一次接口的调用。每次获取的AccessToken有效期是2个小时,失效后需要重新换取,我利用缓存处理把每次获取的AccessToken保存起来,设置7100秒,防止临界值的情况,并把它设置成静态属性,封装获取过程。在每次调用微信接口时,直接校验是否失效。

static string AccessToken get return qyUtils.GetTenket();
///


/// 应用toket获取
///

///
public static string GetTenket()

try

var cache = new mCache("token", "qyAccessToken");
if (cache.ValidCache()) return cache.GetCache().ToString();
string url = string.Format("0/cgi-bin/gettoken", Globals.QY_HTTP);
StringBuilder param = new StringBuilder();
param.Append("corpid=");
param.Append(Globals.CORP_ID);
param.Append("&corpsecret=");
param.Append(Globals.CORP_SECRET);
string strValue = Utils.GetData(url, param.ToString());
ACCESS_TOKEN ac_token = JsonConvert.DeserializeObject(strValue);
if (ac_token.errcode == ReturnCode.请求成功)

cache.ExpireTime = 7100;
cache.SetCache(ac_token.access_token);
return ac_token.access_token;

else

HttpContext.Current.Response.Write("");
return null;


catch
return null;




接口封装

工欲善其事必先利其器!微信提供的API接口都是HTTP的POST请求和Get请求,我们可以封装成工具类,方面后期的使用。对于Get请求,我把URL变量作为参数传入发送
HttpWebRequest请求,获取
HttpWebResponse响应,反序列化结果判断请求是否成功,对于Post请求也差不多,只是多加一个传入数据的参数变量。

public static string PostData(string url, string data)

data = Regex.Unescape(data);
string json = HttpPost(url, data);
try

var item = JsonConvert.DeserializeObject(json);
if (item.errcode != 0)

if (item.errcode == ReturnCode.获取access_token时AppSecret错误或者access_token无效 || item.errcode == ReturnCode.oauth_code超时)
ClearTenket();
item.errmsg = item.errcode.ToString();
json = JsonConvert.SerializeObject(item);


catch
return json;

公众号经常有需要用到一些临时性的多媒体素材的场景,是通过media_id来进行的,而对于上传文件的POST请求,我直接使用的.NET语言自带的
WebClient进行处理,先将文件上传到自己服务器端,使用相对路径获取服务器上的文件资源,调用微信公众号API,上传文件,返回媒体文件唯一标识。

public static QyUploadTemp WeChatUpload(string url, string type)

try

if (!string.IsNullOrEmpty(qyUtils.GetTenket()))

string posturl = string.Format("0/cgi-bin/media/upload?access_token=1&type=2", Globals.QY_HTTP, AccessToken, type);
System.Net.WebClient webclient = new System.Net.WebClient();
string media = HttpContext.Current.Server.MapPath(url);
byte[] be = webclient.UploadFile(new Uri(String.Format(posturl, AccessToken, type)), media);
string content = Encoding.Default.GetString(be);
var result = JsonConvert.DeserializeObject(content);
if (result.errcode == ReturnCode_QY.请求成功)
return result;


catch
return null;




身份验证

微信应用经常需要获取用户身份信息,这就需要通过OAuth2.0验证接口。利用.NET应用的FormsAuthentication机制,判断请求是否已经过身份验证,否则跳转统一的授权认证处理/OAuth/QyLogOn调用OAuth验证接口获取code,这里需要指定成功获取code之后,根据code获取成员信息,并记录用户信息,身份验证处理。将需获取用户身份信息的方法继承基类QyBaseController,就可以在每次获取用户身份前,先OAuth验证,如果已经过身份验证,则无需重复身份验证。

1、未通过身份验证处理
public ActionResult QyLogOn(string returnUrl)

if (!String.IsNullOrEmpty(returnUrl))

Session["WX_returnUrl"] = returnUrl;

string action = "OAuth/QyLogOnOAuth";
return Redirect(Utils.GetAuthorizeUrl(Globals.CORP_ID, action, "", OAuthScope.snsapi_base));

2、调用OAuth验证接口获取code,这里主要特别注意的是redirectUrl必须保证和浏览器中的地址一致
public static string GetAuthorizeUrl(string appId, string action, string state, OAuthScope scope, string responseType = "code")

string redirectUrl = HttpUtility.UrlEncode(string.Format("0/1", Globals.DOMAIN_URL, action));
string url =
string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid=0&redirect_uri=1&response_type=2&scope=3&state=4#wechat_redirect",
appId, redirectUrl, responseType, scope, state);
return url;

3、根据code获取成员信息,并记录用户信息,身份验证处理
public ActionResult QyLogOnOAuth(string code, string state)

if (string.IsNullOrEmpty(code)) return Content("您拒绝了授权!");
try

//通过,用code获取成员信息
OAuthUserInfoResult result = qyUtils.GetUserInfobyCode(code);
if (string.IsNullOrEmpty(result.UserId))
return Content("

您不是企业用户,请通知管理员添加!
");
var user = qyUtils.GetUserInfobyUserId(result.UserId);
qyWxUser.LogOn(user);
if (Session["WX_returnUrl"] != null) return Redirect(Session["WX_returnUrl"].ToString());

catch (Exception ex)

return Content(ex.Message);

return RedirectToAction("ErrorTip", "Account");


微信端UI框架

由于之前缺乏移动端开发经验,对于前端框架都不熟悉,只能网上了解一些开源的UI框架,又因为自己毕竟不是专业的前端开发工程师,最佳的选择是自带功能丰富组件的开源UI库。经过筛选,最先尝试的是由微信官方的推的weui,发现只有一些简单的组件,对于js请求处理响应都得自己写,便放弃了。后来了解到由阿里巴巴基于Framework7开发的SUI库,轻量、精美,实现了下拉刷新、日历、省市区选择器等功能非常强大的组件。这种资源对于一个只是刚刚入门的前端开发来说,无疑是最好的。但却忽略了很重要的一点,对于这种开源项目来说,团队的的持续维护更新,是至关重要的。随着使用频率增加,以及业务要求的复杂,SUI框架中隐藏的问题渐渐暴露出来:路由跳转页面和路由返回上一个页面存在问题,下拉滚动加载数据不能与上拉刷新并存,android 端微信显示效果比ios端微信差,日历组件初次打开不会聚焦输入框里的时间;这套UI库是引用Zepto.js,再引用Jquery库,会出现冲突以致组件失效、不稳定,而且SUI的主力开发人员已离开阿里巴巴,没有人继续负责维护这个项目了。后来了解到SUI框架的作者另外开了一个新的项目Light7,相当于SUI的升级版,修复了很多bug,还扩展了一些新的功能,而且会长期维护更新,于是又切换新的UI库。

这次前端UI框架的选择,给我最大的体会是项目风险管理,在开发过程中引入新技术,不可避免地要遇到各种风险。对于新技术开发,在项目开发早期,就应该建立系统的架构,解决关键技术难题、开发的基础构件,对所需要应用的技术做深度探索。越是技术复杂度高的项目,就越应该早地处理技术难题。新技术开发是探索性很强的工作,潜在着许多失败的风险,在可行性分析阶段,要广泛搜集相关信息,设计多种可行方案,进行充分论证。如果针对新技术,没有经验可借鉴,探索过程中要充分利用互联网资源,学习同行经验,往往事半功倍。

用户体验

微信端开发类似一个App软件应用,页面数据渲染速度对用户体验是至关重要的,微信端数据加载采用的是Juicer模板渲染的方式,高效、轻量的前端 (Javascript) 模板引擎,当用户进行滚动加载或者下拉刷新时,体验很流畅。对于ASP.NET MVC程序,需要解决一个符号的冲突,把@符号换成&,然后把后端处理得到的数据封装成指定的JSON格式,绑定模板即可。模板的定义(注:这里的"&"符号使用必须修改juicer.js中的"@"):


封装JS调用,以参数的形式指定渲染的模板ID和数据,统一处理渲染数据的判断过程,降低代码冗余:
initTpl = function (e, t, n)
n || (n = !1),
"feed_list" != e || t.showDing || 0 == t.showDing || (t.showDing = !0);
var i = $("#" + e).html(),
a = juicer(i),
o = a.render(t);
console.log(t);
return t.page && !n && t.total > t.page * t.count && null != t.data && t.data.length > 0 && !n && (o += loadMoreHtml),
o
调用方法就是:
list = JSON.parse(e);
$("#popup-info").find("#inventoryview").html(initTpl("morder_li_head ", list));

管理后台

当申请微信公众号,都会有一个相应的微信管理登陆后台,但是,对于微信端很多自定义功能,需要管理后台进行统一的管理,比如:微信投票项目的发起,参与公司的审核,投票数据统计,ERP用户与微信账号的对应关系,ERP菜单权限分配。数据处理采用的优秀的开源项目jQuery MiniUI,丰富的UI控件、高度的稳定性、强大的扩展能力和平滑的版本升级能力。

集成的功能:系统管理里添加了登陆用户角色和权限管理,指定不同用户类型不同的功能,最高管理员权限用户可以管理多个微信公众号(这一点仍在开发中...),只需开放企业管理员账户给相应客户即可。管理后台添加了日志管理功能,做到错误记录,方便管理员跟踪。对于微信ERP主要是企业号应用管理,微信端ERP菜单管理,微信用户添加、修改和关联ERP用户,分配ERP菜单权限,以及指定微信用户发送文本、图文、图片、文件、视频、语音消息。


注:后续我还会针对应用的技术进行拆分讲解记录,主要是给自己做一个积累,也供大家学习参考,少走弯路。



推荐阅读
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • 解决文件名过长下载失败问题的jQuery方案
    本文介绍了使用jQuery解决文件名过长导致下载失败的问题。原方案中存在文件名部分丢失的问题,通过动态生成隐藏域表单并提交的方式来解决。详细的解决方案和代码示例在文章中给出。 ... [详细]
  • Python15行代码实现免费发送手机短信,推送消息「建议收藏」
    Python15行代码实现免费发 ... [详细]
author-avatar
kyijhx
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有